package com.ce.pms.charge.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;

import com.ce.pms.base.dao.impl.PmsBaseDaoImpl;
import com.ce.pms.charge.dao.IChargeStaDao;
import com.ce.pms.charge.model.AbstractStaVersion;
import com.ce.pms.charge.model.ChargeStaDomain;
import com.ce.pms.charge.vo.ChargeStaVO;
import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.util.BlankUtil;
import com.sitechasia.webx.core.support.Page;
/**
 * 功能描述: 收费标准版本DAO功能处理类
 * <p>版权所有：中企动力
 * <p>未经本公司许可，不得以任何方式复制或使用本程序任何部分
 * @author  胡煦
 * Create on:2008-8-13
 * Edit author:
 * Edit on:
 * 修改原因：
 */
public class ChargeStaDaoImpl extends PmsBaseDaoImpl<ChargeStaDomain> implements IChargeStaDao {
	/**
	 * 方法描述: 分页查询收费标准列表
	 * @author 胡煦
	 * Create on:2008-8-1
	 * @param chargeItemId,pageNo,pageSize
	 * @return Page
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Page queryChargeSatByPage(Long chargeItemId,int pageNo,int pageSize){
		 if(BlankUtil.isBlank(chargeItemId)){
				return null;
			}
		 String queryStr =  "FROM ChargeStaDomain cs WHERE cs.chargeItem.keyword = ? ";

		 return this.pagedQueryByPageNo(queryStr, pageNo, pageSize,new Object[]{chargeItemId});
	}

	/**
	 * 方法描述: 查询某个收费项目下所有收费标准
	 *
	 * @author 胡煦 Create on:2008-8-18
	 * @param chargeItemId
	 * @return List<ChargeStaVO> Edit author: Edit on: 修改原因：
	 */
	public List<ChargeStaDomain> queryAllChargeSatBy(Long chargeItemId){
		 String queryStr =  "FROM ChargeStaDomain cs WHERE cs.chargeItem.id = ?";
		 return this.createQuery(queryStr,chargeItemId).list();
	}

	/**
	 * 方法描述: 查询所有的收费标准版本
	 *
	 * @author 胡煦 Create on:2008-8-18
	 * @param
	 * @return List<AbstractStaVersion> Edit author: Edit on: 修改原因：
	 */
	public List<AbstractStaVersion> queryAllChargeSatVersionBy(){
		 String queryStr =  "select cs.cVersion FROM ChargeStaDomain cs";
		 return this.createQuery(queryStr).list();
	}

	/**
	 * 方法描述: 查询所有的收费标准版本以及其对应的有效收费标准版本
	 *
	 * @author 胡煦 Create on:2008-8-18
	 * @param
	 * @return List<AbstractStaVersion> Edit author: Edit on: 修改原因：
	 */
	public List<Object[]> queryChargeSatVersionAnd(){
		 String queryStr =  "select a.id,b FROM AbstractStaVersion a ,AbstractStaVersion b where a.chargeSta.id = b.chargeSta.id and b.statuz = 002";
		 return this.createQuery(queryStr).list();
	}

	/**
	 * 方法描述: 查询所有当前有效的收费标准版本
	 *
	 * @author 胡煦 Create on:2008-8-18
	 * @param
	 * @return List<AbstractStaVersion> Edit author: Edit on: 修改原因：
	 */
	public List<AbstractStaVersion> queryAllChargeSatVersion(){
		 String queryStr =  "select cs.cVersion FROM ChargeStaDomain cs WHERE cs.cVersion.statuz = 002";
		 return this.createQuery(queryStr).list();
	}

	/**
	 * 方法描述: 根据收费标准ID查询当前收费标准版本
	 * @author 胡煦
	 * Create on:2008-8-15
	 * @param chargeStaId
	 * @return AbstractStaVersion
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public AbstractStaVersion queryCVersionByChargeStaId(Long chargeStaId){
		 if(BlankUtil.isBlank(chargeStaId)){
				return null;
			}
		 String queryStr =  "FROM ChargeStaDomain cs WHERE cs.id = ? ";
		 Query query = this.createQuery(queryStr, new Object[]{chargeStaId});
		 ChargeStaDomain chargeStaDomain = (ChargeStaDomain) query.uniqueResult();

		 return chargeStaDomain.getCVersion();
	}

	/**
	 * 方法描述: 根据收费标准名称查询记录数
	 *  注：新建判断chargeStaName的唯一性时，chargeStaId为null；修改判断chargeStaName的唯一性时，则需要传入修改前的chargeStaId<br>
	 * @author 胡煦
	 * Create on:2008-8-1
	 * @param chargeStaName
	 * @return chargeStaId
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Long checkChargeStaNameIsOnly(String chargeStaName,Long chargeStaId){
		StringBuffer hql=new StringBuffer();
		List list = new ArrayList();
		list.add(chargeStaName);

		hql.append("select count(*) FROM  ChargeStaDomain cd WHERE cd.staName = ? ");
		if(chargeStaId!=null){
			hql.append(" and cd.id <> ?");
			list.add(chargeStaId);
		}
		Query query=this.createQuery(hql.toString(), list.toArray());
		Object result=query.uniqueResult();
		return (result == null ? null : (Long)result );
	}

	/**
	 * 功能描述:取出所有收费标准版本，一个项目仅取出一个版本。返回值:key 收费项目ID，value 收费版本<br>
	 * 注：本方法仅供生成收费通知单用。<br>
	 * @return<br>
	 * Create author:罗军林<br>
	 * Create on:2008-9-22<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public Map<Long,AbstractStaVersion> queryVersionByChargeItem(){
		String hql="SELECT ver FROM AbstractStaVersion ver JOIN FETCH ver.chargeSta sta JOIN FETCH sta.chargeItem WHERE ver.statuz=? GROUP BY ver.chargeSta.chargeItem.keyword";
		Query query=createQuery(hql, SysrefcodeDO.FEE_STA_VERSION_STATUZ_VALID);
		Map<Long,AbstractStaVersion>  staMap=new HashMap<Long, AbstractStaVersion>();
		List<AbstractStaVersion> list=query.list();
		for(AbstractStaVersion sta : list){
			staMap.put(sta.getChargeSta().getChargeItem().getKeyword(), sta);
		}
		return staMap;
	}

	/**
	 * 功能描述:根据标准的名称，查询固定收费项目的有有效收费标准及价格<br>
	 * @param <br>
	 * @return<br>
	 *
	 * Create author:xuhaidui<br>
	 * Create on:2009-1-5<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public List queryChargeSelectList(String chargeStaName){

		List listtemp = new ArrayList();
		StringBuffer script=new StringBuffer();
		script.append(" SELECT sta.STA_NAME,v.PRICE  ");
		script.append(" FROM FEE_CHARGE_ITEM item,FEE_CHAR_STA  sta ,FEE_STA_VERSION v ");
		script.append(" WHERE  item.CHARGE_ITEM_ID=sta.CHARGE_STA_ID AND sta.CHARGE_STA_ID =v.STA_HIS_ID ");
		script.append(" AND item.CHARGE_CLASS='003' and v.STATUZ='002' ");
		if(!BlankUtil.isBlank(chargeStaName)){
			script.append(" AND sta.STA_NAME LIKE ?");
			listtemp.add("%"+chargeStaName+"%");
		}
		Query query=this.createSQLQuery(script.toString(), listtemp.toArray());

		return query.list();
	}

}
